package JianZhiOffer;

/**
 * 给你一根长度为 n 的绳子，请把绳子剪成整数长度的 m 段（m、n都是整数，n>1并且m>1），
 * 每段绳子的长度记为 k[0],k[1]...k[m] 。请问 k[0]*k[1]*...*k[m] 可能的最大乘积是多少？
 * 例如，当绳子的长度是8时，我们把它剪成长度分别为2、3、3的三段，此时得到的最大乘积是18。
 * <p>
 * 输入: 10
 * 输出: 36
 * 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
 */
public class Solution14 {

    /**
     * 数学规律：
     * 将绳子剪成3的长度为一段时，成绩最大。与自然数e=2.63有关
     * 最优：把绳子尽可能切为多个长度为3的片段，留下的最后一段绳子的长度可能为0,1,2三种情况。
     * 次优：若最后一段绳子长度为 2；则保留，不再拆为1+1 。
     * 最差：若最后一段绳子长度为 1；则应把一份3+1 替换为2+2，因为2 * 2 > 3 * 1
     */
    public int cuttingRope(int n) {
        if (n == 2) return 1;
        if (n == 3) return 2;
        if (n == 4) return 4;

        if (n % 3 == 0) return (int) Math.pow(3, n / 3);
        if (n % 3 == 2) return (int) Math.pow(3, n / 3) * 2;
        if (n % 3 == 1) return (int) Math.pow(3, n / 3 - 1) * 4;
        return 0;
    }
}
